home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / lboss02.lzh / enemy.c next >
C/C++ Source or Header  |  1999-04-28  |  10KB  |  470 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "main.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8. #include "parts.h"
  9.  
  10. #define ENEMY_MAX    256    /* 最大数 */
  11.  
  12.  
  13. #define P1_K    0.5        /* ばね定数(左右大パーツ) */
  14. #define P1_M    0.2        /* 摩擦計数(左右大パーツ) */
  15. #define P1_V    0.5        /* 速度がこれ以下なら次へ(左右大パーツ) */
  16. #define P1_L    0.4        /* 座標がこれ以下なら次へ(左右大パーツ) */
  17.  
  18. /* 2段階目大パーツ合体時 */
  19. #define P3_K    1.5        /* ばね定数 */
  20. #define P3_M    0.10        /* 摩擦計数 */
  21. #define P3_V    0.8        /* 速度がこれ以下なら次へ */
  22. #define P3_L    0.8        /* 座標がこれ以下なら次へ */
  23.  
  24. /* 2段階目左右翼パーツ */
  25. #define P5_K    3.0        /* ばね定数(左右上小パーツ) */
  26. #define P5_M    0.02        /* 摩擦計数(左右上小パーツ) */
  27. #define P5_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  28. #define P5_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  29.  
  30. /* 2段階目左右耳パーツ */
  31. #define P7_K    3.0        /* ばね定数(左右上小パーツ) */
  32. #define P7_M    0.02        /* 摩擦計数(左右上小パーツ) */
  33. #define P7_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  34. #define P7_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  35.  
  36.  
  37. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  38.  *enemy_null_top,        /* 空のワークのリスト */
  39.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  40.  
  41. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  42.  
  43. extern char end_of_data;
  44. extern char f_option_flag;
  45.  
  46. typedef struct _spwork {
  47.     signed short x, y;    /* 座標 */
  48.     unsigned short pt;    /* スプライトパターンNo. */
  49.     unsigned short info;    /* 反転コード・色・優先度を表わすデータ */
  50. } SPWORK;
  51.  
  52.  
  53. SPWORK spwork;
  54.  
  55. FILE *fp_parts3, *fp_parts5, *fp_parts6, *fp_parts7, *fp_parts8;
  56.  
  57.  
  58. int EnemyInit0 (void)
  59. {
  60.     int i;
  61.  
  62.     /* リストをつなげる */
  63.     enemy_top = NULL;
  64.     enemy_end = NULL;
  65.     enemy_null_top = enemy;
  66.     for (i = 0; i < ENEMY_MAX; i++)
  67.         enemy[i].next = &enemy[i + 1];
  68.  
  69.     enemy[ENEMY_MAX - 1].next = NULL;
  70.  
  71.     return (0);
  72. }
  73.  
  74.  
  75.  
  76. void EnemyInit (unsigned short type, unsigned short info,
  77.         signed short ox, signed short oy, ENEMY * parent)
  78. {
  79.     ENEMY *p;
  80.  
  81.     if (enemy_null_top == NULL) {
  82.         printf ("ワークが一杯です\n");
  83.         return;        /* 空きのワークがない(キャラクターオーバー) */
  84.     }
  85.     /* リストの末尾に新しいノードを追加 */
  86.     p = enemy_null_top;
  87.     enemy_null_top = p->next;
  88.     if (enemy_top == NULL)
  89.         enemy_top = p;
  90.     else
  91.         enemy_end->next = p;
  92.     p->next = NULL;
  93.     enemy_end = p;
  94.  
  95.     p->type = type;
  96.     p->info = info;
  97.     p->ox = ox;
  98.     p->oy = oy;
  99.     p->x = 0;
  100.     p->y = 0;
  101.     p->parent = parent;
  102.  
  103.     p->lx = 0.0;
  104.     p->ly = 0.0;
  105.     p->lz = 0.0;
  106.     p->vx = 0.0;
  107.     p->vy = 0.0;
  108.     p->vz = 0.0;
  109.     p->cyc = 0;
  110.     p->cyc1 = 0;
  111.  
  112.     switch (p->type) {
  113.     case 3:        /* 2段階目大パーツ */
  114.         if (f_option_flag)
  115.             fp_parts3 = fopen ("parts3.doc", "w");
  116.         p->ly = 192.0;
  117.         p->vy = -6.4;
  118.         break;
  119.     case 5:
  120.         if (f_option_flag)
  121.             fp_parts5 = fopen ("parts5.doc", "w");
  122.         break;
  123.     case 6:
  124.         if (f_option_flag)
  125.             fp_parts6 = fopen ("parts6.doc", "w");
  126.         break;
  127.     case 7:
  128.         if (f_option_flag)
  129.             fp_parts7 = fopen ("parts7.doc", "w");
  130.         break;
  131.     case 8:
  132.         if (f_option_flag)
  133.             fp_parts8 = fopen ("parts8.doc", "w");
  134.         break;
  135.     default:
  136.         break;
  137.     }
  138. }
  139.  
  140.  
  141. /* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
  142. static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
  143. {
  144.     short h;
  145.  
  146.     for (h = 0; h < sp_num; h++) {
  147.         p->x = p->lx + p->ox;
  148.         p->y = p->ly + p->oy;
  149.         if (p->parent != NULL) {
  150.             spwork.x = p->x + p->parent->x + parts_table[h].x;
  151.             spwork.y = p->y + p->parent->y + parts_table[h].y;
  152.         } else {
  153.             spwork.x = p->x + parts_table[h].x;
  154.             spwork.y = p->y + parts_table[h].y;
  155.         }
  156.         spwork.pt = parts_table[h].pt;
  157.         spwork.info = p->info;
  158.  
  159.         spwork.x += (128 + 16);    /* 表示用に補正 */
  160.         spwork.y += (128 + 16);
  161.         xsp_set_st (&spwork);
  162.         fxsp_set_st (&spwork);
  163.         spwork.x -= (128 + 16);
  164.         spwork.y -= (128 + 16);
  165.     }
  166. }
  167.  
  168.  
  169.  
  170. void EnemyMove (void)
  171. {
  172.     ENEMY *p, *q;
  173.  
  174.     p = enemy_top;
  175.     q = NULL;
  176.     while (p != NULL) {
  177.         char erase_flag = 0;
  178.  
  179.         switch (p->type) {
  180.         case 0:    /* 1段階目 */
  181.             DispSp (p, 54, parts0_table);
  182.             erase_flag = !0;
  183.             break;
  184.         case 1:    /* 1段階目で分離した本体 */
  185.             DispSp (p, 24, parts1_table);
  186.             if (seq_counter == 58)
  187.                 erase_flag = !0;
  188.             break;
  189.         case 2:    /* 1段階目で分離した頭 */
  190.             DispSp (p, 30, parts2_table);
  191.             erase_flag = !0;
  192.             break;
  193.  
  194.         case 3:    /* 2段階目大パーツ */
  195.             switch (p->cyc) {
  196.             case 0:
  197.                 p->ly += p->vy;
  198.                 if (p->ly < 32.0)
  199.                     p->cyc++;
  200.                 break;
  201.             case 1:
  202.                 if ((p->ly > 1.0) && (p->vy < -1.2))
  203.                     p->vy += 0.8;
  204.                 p->ly += p->vy;
  205.                 if (p->ly < 1.0)
  206.                     p->cyc++;
  207.                 break;
  208.             case 2:/* ばね振動 */
  209.                 p->vy -= p->ly * P3_K;
  210.                 /* 摩擦 */
  211.                 if (p->vy > 0)
  212.                     p->vy -= P3_M;
  213.                 else
  214.                     p->vy += P3_M;
  215.                 p->ly += p->vy;
  216.                 if ((fabs (p->vy) < P3_V) && (fabs (p->ly) < P3_L)) {
  217.                     p->cyc++;    /* 次へ */
  218.                     p->lx = 0.0;
  219.                     p->ly = 0.0;
  220.                     p->vx = 0.0;
  221.                     p->vy = 0.0;
  222.                 }
  223.                 break;
  224.             case 3:
  225.                 erase_flag = !0;
  226.                 break;
  227.             default:
  228.                 break;
  229.             }
  230.             if (f_option_flag)
  231.                 fprintf (fp_parts3, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  232.             DispSp (p, 60, parts3_table);
  233.             break;
  234.  
  235.         case 4:    /* 2段階目本体 */
  236.             DispSp (p, 90, parts4_table);
  237.             break;
  238.  
  239.         case 5:    /* 左翼パーツ */
  240.             switch (p->cyc) {
  241.             case 0:
  242.                 p->cyc++;    /* 次へ */
  243.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  244.                 p->vz = 0.0;
  245.                 break;
  246.             case 1:/* 加速度的に離れる */
  247.                 if (p->vz < 0.20)
  248.                     p->vz += 0.10;
  249.                 p->lz += p->vz;
  250.                 p->lx = (18 - 54) * p->lz;    /* 終点-始点 */
  251.                 p->ly = (168 - 143) * p->lz;
  252.                 if (p->lz > 1.0) {
  253.                     p->cyc++;    /* 次へ */
  254.                     p->lz = 0.0;
  255.                     p->lx = 0.0;    /* 今度はここが原点になる */
  256.                     p->ly = 0.0;
  257.                     p->ox += (18 - 54);
  258.                     p->oy += (168 - 143);
  259.                 }
  260.                 break;
  261.             case 2:/* ばね振動 */
  262.                 p->vz -= p->lz * P5_K;
  263.                 /* 摩擦 */
  264.                 if (p->vz > 0)
  265.                     p->vz -= P5_M;
  266.                 else
  267.                     p->vz += P5_M;
  268.                 p->lz += p->vz;
  269.                 p->lx = (18 - 54) * p->lz;
  270.                 p->ly = (168 - 143) * p->lz;
  271.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  272.                     p->cyc++;    /* 次へ */
  273.                     p->lx = 0.0;
  274.                     p->ly = 0.0;
  275.                     p->vx = 0.0;
  276.                     p->vy = 0.0;
  277.                 }
  278.                 break;
  279.             default:
  280.                 break;
  281.             }
  282.             if (f_option_flag)
  283.                 fprintf (fp_parts5, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  284.             DispSp (p, 16, parts5_table);
  285.             break;
  286.  
  287.         case 6:    /* 右翼パーツ */
  288.             switch (p->cyc) {
  289.             case 0:
  290.                 p->cyc++;    /* 次へ */
  291.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  292.                 p->vz = 0.0;
  293.                 break;
  294.             case 1:/* 加速度的に離れる */
  295.                 if (p->vz < 0.20)
  296.                     p->vz += 0.10;
  297.                 p->lz += p->vz;
  298.                 p->lx = -(18 - 54) * p->lz;    /* 終点-始点 */
  299.                 p->ly = (168 - 143) * p->lz;
  300.                 if (p->lz > 1.0) {
  301.                     p->cyc++;    /* 次へ */
  302.                     p->lz = 0.0;
  303.                     p->lx = 0.0;    /* 今度はここが原点になる */
  304.                     p->ly = 0.0;
  305.                     p->ox -= (18 - 54);
  306.                     p->oy += (168 - 143);
  307.                 }
  308.                 break;
  309.             case 2:/* ばね振動 */
  310.                 p->vz -= p->lz * P5_K;
  311.                 /* 摩擦 */
  312.                 if (p->vz > 0)
  313.                     p->vz -= P5_M;
  314.                 else
  315.                     p->vz += P5_M;
  316.                 p->lz += p->vz;
  317.                 p->lx = -(18 - 54) * p->lz;
  318.                 p->ly = (168 - 143) * p->lz;
  319.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  320.                     p->cyc++;    /* 次へ */
  321.                     p->lx = 0.0;
  322.                     p->ly = 0.0;
  323.                     p->vx = 0.0;
  324.                     p->vy = 0.0;
  325.                 }
  326.                 break;
  327.             default:
  328.                 break;
  329.             }
  330.             if (f_option_flag)
  331.                 fprintf (fp_parts6, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  332.             DispSp (p, 16, parts6_table);
  333.             break;
  334.  
  335.         case 7:    /* 左耳パーツ */
  336.             switch (p->cyc) {
  337.             case 0:
  338.                 p->cyc++;    /* 次へ */
  339.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  340.                 p->vz = 0.0;
  341.                 break;
  342.             case 1:/* 加速度的に離れる */
  343.                 if (p->vz < 0.20)
  344.                     p->vz += 0.10;
  345.                 p->lz += p->vz;
  346.                 p->lx = (65 - 68) * p->lz;    /* 終点-始点 */
  347.                 p->ly = (115 - 134) * p->lz;
  348.                 if (p->lz > 1.0) {
  349.                     p->cyc++;    /* 次へ */
  350.                     p->lz = 0.0;
  351.                     p->lx = 0.0;    /* 今度はここが原点になる */
  352.                     p->ly = 0.0;
  353.                     p->ox += (65 - 68);
  354.                     p->oy += (115 - 134);
  355.                 }
  356.                 break;
  357.             case 2:/* ばね振動 */
  358.                 p->vz -= p->lz * P7_K;
  359.                 /* 摩擦 */
  360.                 if (p->vz > 0)
  361.                     p->vz -= P7_M;
  362.                 else
  363.                     p->vz += P7_M;
  364.                 p->lz += p->vz;
  365.                 p->lx = (65 - 68) * p->lz;
  366.                 p->ly = (115 - 134) * p->lz;
  367.                 if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
  368.                     p->cyc++;    /* 次へ */
  369.                     p->lx = 0.0;
  370.                     p->ly = 0.0;
  371.                     p->vx = 0.0;
  372.                     p->vy = 0.0;
  373.                     end_of_data = !0;    /* debug */
  374.                 }
  375.                 break;
  376.             default:
  377.                 break;
  378.             }
  379.             if (f_option_flag)
  380.                 fprintf (fp_parts7, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  381.             DispSp (p, 12, parts7_table);
  382.             break;
  383.  
  384.         case 8:    /* 右耳パーツ */
  385.             switch (p->cyc) {
  386.             case 0:
  387.                 p->cyc++;    /* 次へ */
  388.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  389.                 p->vz = 0.0;
  390.                 break;
  391.             case 1:/* 加速度的に離れる */
  392.                 if (p->vz < 0.20)
  393.                     p->vz += 0.10;
  394.                 p->lz += p->vz;
  395.                 p->lx = -(65 - 68) * p->lz;    /* 終点-始点 */
  396.                 p->ly = (115 - 134) * p->lz;
  397.                 if (p->lz > 1.0) {
  398.                     p->cyc++;    /* 次へ */
  399.                     p->lz = 0.0;
  400.                     p->lx = 0.0;    /* 今度はここが原点になる */
  401.                     p->ly = 0.0;
  402.                     p->ox -= (65 - 68);
  403.                     p->oy += (115 - 134);
  404.                 }
  405.                 break;
  406.             case 2:/* ばね振動 */
  407.                 p->vz -= p->lz * P7_K;
  408.                 /* 摩擦 */
  409.                 if (p->vz > 0)
  410.                     p->vz -= P7_M;
  411.                 else
  412.                     p->vz += P7_M;
  413.                 p->lz += p->vz;
  414.                 p->lx = -(65 - 68) * p->lz;
  415.                 p->ly = (115 - 134) * p->lz;
  416.                 if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
  417.                     p->cyc++;    /* 次へ */
  418.                     p->lx = 0.0;
  419.                     p->ly = 0.0;
  420.                     p->vx = 0.0;
  421.                     p->vy = 0.0;
  422.                 }
  423.                 break;
  424.             default:
  425.                 break;
  426.             }
  427.             if (f_option_flag)
  428.                 fprintf (fp_parts8, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  429.             DispSp (p, 12, parts8_table);
  430.             break;
  431.  
  432.         default:
  433.             printf ("enemy_move() : バグってます\n");
  434.             break;
  435.         }
  436.  
  437.         if (erase_flag) {
  438.             if (q == NULL) {    /* リストの一番最初を削除 */
  439.                 enemy_top = p->next;
  440.                 p->next = enemy_null_top;
  441.                 enemy_null_top = p;
  442.                 q = NULL;
  443.                 p = enemy_top;
  444.             } else {
  445.                 q->next = p->next;
  446.                 p->next = enemy_null_top;
  447.                 enemy_null_top = p;
  448.                 p = q->next;
  449.             }
  450.         } else {
  451.             q = p;
  452.             p = p->next;
  453.         }
  454.     }
  455. }
  456.  
  457.  
  458. void EnemyTini (void)
  459. {
  460.     int i;
  461.  
  462.     /* リストをつなげる */
  463.     enemy_top = NULL;
  464.     enemy_null_top = enemy;
  465.     for (i = 0; i < ENEMY_MAX; i++)
  466.         enemy[i].next = &enemy[i + 1];
  467.  
  468.     enemy[ENEMY_MAX - 1].next = NULL;
  469. }
  470.